package com.yzh.chatgpt.model;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.yzh.chatgpt.common.Constants;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * ChatGPT API请求携带的参数
 * https://platform.openai.com/docs/api-reference/chat/object
 */
@Data
@Slf4j
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)  //序列化JSON字符串时，去除为null的属性
public class ChatCompletionRequest implements Serializable {
    /** 默认模型 */
    private String model = Constants.Model.GPT_3_5_TURBO.getCode();
    /** 问题描述 */
    private List<Message> messages;
    /** 控制温度（随机性）0~2之间。较高的值（如0.8）使输出更加随机，较低的值（如0.2）使输出更加集中且确定。 */
    private double temperature = 0.2;
    /** 多样性控制：温度采样的替代方法，0.1 意味着仅考虑包含前 10% 概率质量的标记。它和temperature选其一更改，不要同时更改两者*/
    @JsonProperty("top_p")
    private Double topP;
    /** 为每条输入消息生成多少个聊天完成选项. 将n保留为1以最大限度的降低成本 */
    private Integer n = 1;
    /** 是否为流式输出：一蹦一蹦的出来结果 */
    private boolean stream = false;
    /** 停止输出标识 */
    private List<String> stop;
    /** 聊天完成时生成最大数量Tokens 也就是输出最大文字有多少 0~4096 */
    @JsonProperty("max_tokens")
    private Integer maxTokens = 2048;
    /** 存在惩罚；-2.0 和 2.0 之间的数字，增强模型谈论新话题的可能性 */
    @JsonProperty("presence_penalty")
    private double presencePenalty = 0;
    /** 生成多个调用结果，只显示最佳的。这样会更多的消耗你的 api token */
    @JsonProperty("logit_bias")
    private Map logitBias;
    /** 调用标识，避免重复调用 */
    private String user;
}
